<?php

App::uses('AppController', 'Controller');

class EventosController extends AppController {
    /**
     * 				CONTROLLER DATA MEMBERS
     */

    /**
     * Componennte de sesion de cake
     *
     * En este archivo se usa la sesión para poder usar la función setFlash
     *
     * @var array(string)
     */
    public $components = array('Session');

    /**
     * Nombre del modelo
     *
     * Nombre del modelo para un alias las consultas y busquedas, ingresos y
     * otras interacciones con la base de datos.
     *
     * @var string
     */
    public $name = "Eventos";

    /**
     * Modelos que utiliza
     *
     * Los modelos que usa el controller. Por defecto
     * cake usa el singular basado en el nombre del modelo,
     * pero por asuntos del idioma siempre se ingresa el modelo
     * para evitar posibles problemas.
     *
     * @var array(string)
     */
    public $uses = array("Evento");
    public $helpers = array('Html', 'Form');

    /**
     * 				CONTROLLER CALLBACKS METHODS
     */

    /**
     * Acciones a ejecutar antes de aplicar el filtro del autenticador
     *
     * Metodo donde se especifican acciones a ejecutar antes de que se
     * aplique el filtro del autenticador
     *
     * @return void
     */
    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow("index");
    }

    // public function afterFilter() {
    // }
    // public function beforeRender() {
    // }

    /**
     * 				CONTROLLER METHODS (ACTIONS)
     */

    /**
     * Action por defecto para los eventos
     *
     * Este es el metodo base de los eventos, en este metodo
     * se buscan los eventos almacendos en el sistema y se
     * devuelven a la vista para que el usuario pueda realizar
     * acciones sobre ellos
     *
     * @return void
     */
    public function index() {

    }

    public function retrieve_all() {
        if ($this->request->is('ajax')) {
            $data = $this->request->data;

            foreach ($data['order'] as $i => $order) {
                $data['order'][$i] = array(
                    'column' => $data['columns'][$data['order'][$i]['column']]['data'],
                    'direction' => strtoupper($data['order'][$i]['dir'])
                );
            }

            $filter = array();
            foreach ($data['columns'] as $i => $column) {
                if ($column['searchable'] === "true" && !empty($column['search']['value'])) {
                    $filter[] = array(
                        'column' => $column['name'],
                        'value' => $column['search']['value']
                    );
                }
            }

            $models = $this->Evento->findAll($start = $data['start'], $length = $data['length'], $order = $data['order'], $filter);
            $totalWithFilter = $this->Evento->findCountAll($filter);
            $total = $this->Evento->findCountAll();

            $this->set(array(
                'draw' => $data['draw'],
                'results' => $models,
                'recordsTotal' => $total,
                'recordsFiltered' => $totalWithFilter
            ));
            $this->set('_serialize', array('results', 'recordsTotal', 'draw', 'recordsFiltered'));
        } else {
            $this->autoRender = false;
        }
    }

    /**
     * Consultar la información de un evento especifico
     *
     * En este metodo se busca la parada según el parametro de
     * entrada $id_evento, si dicho parametro es nulo o si no se encuentra
     * un evento con ese identificador asociado se devulve un error.
     * por otro lado si se encuentra el evento se devuelve su
     * información a la vista para que sea procesada.
     *
     *
     * @param int $id_evento identifiacador del evento que se va a buscar.
     * @return void
     */
    public function ver($id_evento = null) {

        if (!$id_evento) {

            throw new NotFoundException(__('Evento inválido'));
        }
        $informacion_evento = $this->Evento->findByid_evento($id_evento);
        if (!$informacion_evento) {
            throw new NotFoundException(__('Evento inválido'));
        }
        $this->set('detalles', $informacion_evento);
    }

    /**
     * Adiciona un nuevo evento
     *
     * Este metodo adiciona un nuevo evento a la base de datos
     *
     * La función verifica que el request es un post, de esa
     * se da cuenta si se esta guardando un nuevo evento o si
     * simplemente se esta haciendo un llamado a la vista de
     * este action. Se adicionan los campos de auditoría, y se
     * verifica si el evento fue almacenado correctamente.
     *
     * @return void
     */
    public function agregar() {
        if ($this->request->is('post')) {
            $this->Evento->create();
            if ($this->Evento->save($this->request->data)) {
                $this->Session->setFlash('el evento ha sido guardado');
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash('el evento no ha sido guardado');
            }
        }
    }

    /**
     * Editar un evento previamente almacenado
     *
     * Se verifica que el parametro $id_evento no sea nulo y luego se busca el
     * evento a editar, en caso de tener el parametro vacio o de no
     * encontrar el evento se lanza una exception con el mensaje de
     * error correspondiente. Posteriormente se verifica si se están
     * almacenando los nuevos datos del evento, de ser asi se guardan
     * estos nuevos datos y el metodo termina. De lo contrario se asume
     * que se esta haciendo un get de la vista de editar y por eso se
     * devuelven los datos del evento para que sean presentados en la
     * vista de edición.
     *
     * @param int $id_evento identifiacador del evento que se va a editar.
     * @return void
     */
    public function editar($id_evento = null) {
        if (!$id_evento) {
            throw new NotFoundException(__('evento inválido'));
        }
        $informacion_evento = $this->Evento->findByid_evento($id_evento);
        if (!$informacion_evento) {
            throw new NotFoundException(__('evento inválido'));
        }
        if ($this->request->is('post') || $this->request->is('put')) {
            $this->Evento->id_evento = $id_evento;
            if ($this->Evento->save($this->request->data)) {
                $this->Session->setFlash('el evento ha sido actualizado');
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash('el evento no ha sido actualizado');
            }
        }

        if (!$this->request->data) {
            $this->request->data = $informacion_evento;
        }
    }

    /**
     * Borra un evento de la base de datos
     *
     * Se verifica que el request no sea un get para
     * minimzar la probabilidad de errores. Luego se borra el evento
     * indicado.
     *
     * @param int $id_evento identifiacador de la parada que se va a editar.
     * @return void
     */
    public function borrar($id_evento) {
        if ($this->Evento->delete($id_evento) == 2) {
            $this->Session->setFlash("el evento con id: " . $id_evento . " ha sido eliminado");
        } elseif ($this->Evento->delete($id_evento) == 0) {
            $this->Session->setFlash("el evento con id: " . $id_evento . " no se ha podido eliminar");
        } else {
            $this->Session->setFlash("el evento con id: " . $id_evento . " se elimino y los recorridos realizados asociados");
        }

        $this->redirect(array('action' => 'index'));
    }

}
